
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>是什么缓存穿透？缓存击穿？怎么解决？ - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>是什么缓存穿透？缓存击穿？怎么解决？ - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">什么是缓存穿透？它发生的核心条件是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">缓存穿透指的是对一个数据进行频繁请求，而这个数据既不存在于缓存中，也不存在于底层数据源中。这导致每次请求都会越过缓存，直接访问底层数据源。</div>
          </div>
          <div class="card-source">来源: 缓存穿透</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">文档中提到了哪两种主要方法来解决缓存穿透问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. 空对象缓存：当查询的数据不存在时，将一个空对象存入缓存并设置较短的过期时间。 2. 布隆过滤器：使用布隆过滤器在访问缓存前快速判断请求的数据是否存在，从而过滤掉无效请求。</div>
          </div>
          <div class="card-source">来源: 缓存穿透</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">什么是缓存击穿？它通常与哪类数据有关？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">缓存击穿是指缓存中的某个热点数据突然失效，而此时有大量的并发请求涌入，直接访问底层数据源，导致其压力剧增。它通常与“热点数据”有关。</div>
          </div>
          <div class="card-source">来源: 缓存击穿</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">如何使用“互斥锁”机制来解决缓存击穿问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在缓存失效时，通过加互斥锁，只允许一个请求去查询底层数据源并重建缓存，其他请求则处于等待状态。这样可以避免大量并发请求同时访问数据源。</div>
          </div>
          <div class="card-source">来源: 缓存击穿</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">什么是缓存雪崩？它与缓存击穿的主要区别是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">缓存雪崩是指在某一时间点，缓存中有大量的、不同key的数据同时失效，导致请求全部涌向底层数据源。它与缓存击穿（单个热点数据失效）的主要区别在于失效数据的规模，雪崩是“大量”数据同时失效。</div>
          </div>
          <div class="card-source">来源: 缓存雪崩</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">文档中列举了哪些策略来应对缓存雪崩？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档中列举了三种策略：1. 合理设置失效时间，例如将过期时间分散开；2. 为热点数据设置永不过期；3. 实施限流降级策略，当缓存失效时，限制对底层数据源的请求。</div>
          </div>
          <div class="card-source">来源: 缓存雪崩</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">缓存预热的目的是什么？它主要应用于什么场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">缓存预热的目的是在系统上线或重启之后，预先将一些数据加载到缓存中。这可以避免系统刚启动时因大量缓存未命中而导致请求直接打到数据源，从而保证系统的稳定性和性能。</div>
          </div>
          <div class="card-source">来源: 缓存预热</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">实现缓存预热有哪些常见的方法？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">常见的实现方法有三种：1. 定时任务预热，在系统启动或低峰期自动加载；2. 手动触发预热，通过接口或命令手动加载；3. 冷热数据分离，只对热点数据进行预热，以降低成本。</div>
          </div>
          <div class="card-source">来源: 缓存预热</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">“提前过期”策略是用来解决哪种缓存问题的？它的原理是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">“提前过期”策略是用来解决缓存击穿问题的。其原理是在设置缓存失效时间时，随机增加一个小的时间值，使得缓存的失效时间点能够分散开，从而降低大量缓存同时失效的概率。</div>
          </div>
          <div class="card-source">来源: 缓存击穿</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
